home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / ms_dos / disgas / operand.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-08  |  4.4 KB  |  210 lines

  1. /*** OPERAND.C   (c) S.Enjoji ***/
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6.  
  7. int getdata(void);
  8. void mod0(char *p);
  9. void mod12(char *p);
  10. void imm(char *p);
  11. void simm8(char *p);
  12. void imm8(char *p);
  13. void imm48(char *p);
  14. void offset(char *p);
  15. void disp(char *p);
  16.  
  17. extern char op1[], op2[], op3[];
  18. extern int mod, reg, rm, op32, ad32, oprsize;
  19. extern unsigned long addr;
  20. char *regname[3][8] = {
  21.     "AL","CL","DL","BL","AH","CH","DH","BH",
  22.     "AX","CX","DX","BX","SP","BP","SI","DI",
  23.     "EAX","ECX","EDX","EBX","ESP","EBP","ESI","EDI"
  24. };
  25. char *sregname[8] = {"ES","CS","SS","DS","FS","GS","HS","IS"};
  26. char scale[4] = {1,2,4,8};
  27.  
  28. void operand(int t, char *p)
  29. {
  30.     if(t == 1) {                    /* operand is reg */
  31.         sprintf(p,"%%%s",regname[oprsize][reg]);
  32.     } else if(t == 2) {                /* operand is r/m */
  33.         if(mod == 3) {
  34.             sprintf(p,"%%%s",regname[oprsize][rm]);
  35.         } else if(mod == 0) {
  36.             mod0(p);
  37.         } else {
  38.             mod12(p);
  39.         }
  40.     } else if(t == 3) {                /* operand is sreg */
  41.         sprintf(p,"%%%s",sregname[reg]);
  42.     } else if(t == 4) {                /* operand is CRn reg */
  43.         sprintf(p,"%%CR%d",reg);
  44.     } else if(t == 5) {                /* operand is DBn reg */
  45.         sprintf(p,"%%DB%d",reg);
  46.     } else if(t == 6) {                /* operand is TRn reg */
  47.         sprintf(p,"%%TR%d",reg);
  48.     } else if(t <= 0x17) { /* レジスタ直接指定、modrm 無し */
  49.         sprintf(p,"%%%s",regname[oprsize][t - 0x10]);
  50.     } else if(t <= 0x1f) { /* セグメントレジスタ直接指定、modrm 無し */
  51.         sprintf(p,"%%%s",sregname[t - 0x18]);
  52.     } else if(t == 0x20) {            /* DX */
  53.         sprintf(p,"(%%DX)");
  54.     } else if(t == 0x21) {            /* CL */
  55.         sprintf(p,"%%CL");
  56.     } else if(t == 0x22) {            /* 1 */
  57.         sprintf(p,"$1");
  58.     } else if(t == 0x80) {            /* イミディエットデータ */
  59.         imm(p);
  60.     } else if(t == 0x81) {            /* アドレスオフセット */
  61.         offset(p);
  62.     } else if(t == 0x82) {            /* ディスプレースメント */
  63.         disp(p);
  64.     } else if(t == 0x83) {            /* Sign extended immediate byte */
  65.         simm8(p);
  66.     } else if(t == 0x84) {            /* Immediate byte */
  67.         imm8(p);
  68.     } else if(t == 0x85) {            /* Immediate word:long */
  69.         imm48(p);
  70.     }
  71. }
  72.  
  73. void mod0(char *p)
  74. {
  75.     int ss,index,base,d;
  76.  
  77.     if(rm == 4) {
  78.         d = getdata();
  79.         base = d % 8;
  80.         index = (d >> 3) % 8;
  81.         ss = d >> 6;
  82.         sprintf(p,"(%%%s,%%%s,%d)",
  83.             regname[2][base],regname[2][index],scale[ss]);
  84.     } else if(rm == 5) {
  85.         offset(p);
  86.     } else {
  87.         sprintf(p,"(%%%s)",regname[2][rm]);
  88.     }
  89. }
  90.  
  91. void mod12(char *p)
  92. {
  93.     int ss,index,base,d,d0,d1,d2,d3;
  94.  
  95.     if(rm == 4) {
  96.         d = getdata();
  97.         base = d % 8;
  98.         index = (d >> 3) % 8;
  99.         ss = d >> 6;
  100.         d0 = getdata();
  101.         if(mod == 1) {
  102.             sprintf(p,"0x%02X(%%%s,%%%s,%d)",
  103.                 d0,regname[2][base],regname[2][index],scale[ss]);
  104.         } else {
  105.             d1 = getdata();
  106.             d2 = getdata();
  107.             d3 = getdata();
  108.             sprintf(p,"0x%02X%02X%02X%02X(%%%s,%%%s,%d)",
  109.                 d3,d2,d1,d0,regname[2][base],regname[2][index],scale[ss]);
  110.         }
  111.     } else {
  112.         d0 = getdata();
  113.         if(mod == 1) {
  114.             sprintf(p,"0x%02X(%%%s)",d0,regname[2][rm]);
  115.         } else {
  116.             d1 = getdata();
  117.             d2 = getdata();
  118.             d3 = getdata();
  119.             sprintf(p,"0x%02X%02X%02X%02X(%%%s)",d3,d2,d1,d0,regname[2][rm]);
  120.         }
  121.     }
  122. }
  123.  
  124. void imm(char *p)
  125. {
  126.     int d0,d1,d2,d3;
  127.  
  128.     d0 = getdata();
  129.     if(oprsize == 0) {
  130.         sprintf(p,"$0x%02X",d0);
  131.     } else if(oprsize == 1) {
  132.         d1 = getdata();
  133.         sprintf(p,"$0x%02X%02X",d1,d0);
  134.     } else {
  135.         d1 = getdata();
  136.         d2 = getdata();
  137.         d3 = getdata();
  138.         sprintf(p,"$0x%02X%02X%02X%02X",d3,d2,d1,d0);
  139.     }
  140. }
  141.  
  142. void simm8(char *p)
  143. {
  144.     int d0;
  145.  
  146.     d0 = getdata();
  147.     if(d0 < 0x80) {
  148.         sprintf(p,"$%d",d0);
  149.     } else {
  150.         d0 = 0x100 - d0;
  151.         sprintf(p,"$-%d",d0);
  152.     }
  153. }
  154.  
  155. void imm8(char *p)
  156. {
  157.     int d0;
  158.  
  159.     d0 = getdata();
  160.     sprintf(p,"$0x%02X",d0);
  161. }
  162.  
  163. void imm48(char *p)
  164. {
  165.     int d0,d1,d2,d3,d4,d5;
  166.  
  167.     d0 = getdata();
  168.     d1 = getdata();
  169.     d2 = getdata();
  170.     d3 = getdata();
  171.     d4 = getdata();
  172.     d5 = getdata();
  173.     sprintf(p,"$0x%02X%02X,$0x%02X%02X%02X%02X",d5,d4,d3,d2,d1,d0);
  174. }
  175.  
  176. void offset(char *p)
  177. {
  178.     int d0,d1,d2,d3;
  179.  
  180.     d0 = getdata();
  181.     d1 = getdata();
  182.     d2 = getdata();
  183.     d3 = getdata();
  184.     sprintf(p,"0x%02X%02X%02X%02X",d3,d2,d1,d0);
  185. }
  186.  
  187. void disp(char *p)
  188. {
  189.     int d0,d1,d2;
  190.     unsigned long daddr, d;
  191.  
  192.     d0 = getdata();
  193.     if(oprsize == 0) {
  194.         daddr = addr + ((d0 < 0x80) ? d0 : d0-0x100);
  195.     } else if(oprsize == 1) {
  196.         d = getdata();
  197.         d = (d << 8) + d0;
  198.         daddr = addr + ((d < 0x8000) ? d : d-0x10000);
  199.     } else {
  200.         d1 = getdata();
  201.         d2 = getdata();
  202.         d = getdata();
  203.         d = (d << 8) + d2;
  204.         d = (d << 8) + d1;
  205.         d = (d << 8) + d0;
  206.         daddr = addr + d;
  207.     }
  208.     sprintf(p,"_%08lX",daddr);
  209. }
  210.